﻿'Nombre:                         ImportarArchivoVentana
'Descripcion:                    Ventana la cual permite carga de movimientos en la base de datos desde un archivo de texto
'Dependencias:                 
'Fecha de creación:              20090531
'Autor:                          VMORALES
'Fecha de modifcación:         
'Responsable:                  
'Num. de modifcación:            0

Option Explicit On
Option Strict On

#Region "Imports"

Imports Electrocucaracha.AdminPersonal.DAO
Imports System.IO
Imports Microsoft.VisualBasic.Constants
Imports System.Linq
Imports System.Windows.Forms
Imports Electrocucaracha.AdminPersonal.GUI.Cuenta

#End Region

Namespace Movimiento

    ''' <summary>
    ''' Ventana la cual permite carga de movimientos en la base de datos desde un archivo de texto
    ''' </summary>
    Partial Public Class ImportarArchivoVentana

#Region "Constantes"

#End Region

#Region "Miembros"

        Private _nombreDeArchivo As String = Nothing
        Private _titularSeleccionado As Entidades.TitularDTO = Nothing
        Private cuentasCarga() As Entidades.CuentaDTO = Nothing
        Private categoriasCarga() As Entidades.CategoriaDTO = Nothing
        Public Event MovimientoCambiado()

#End Region

#Region "Propiedades"

#End Region

#Region "Constructores"

#End Region

#Region "Funciones"

        ''' <summary>
        ''' Funcion que carga los titulares de registrados en la base de datos
        ''' </summary>
        Private Sub CargarTitulares()
            With Me.cmbTitulares
                .ItemsSource = Titular.Manejador.TitularesActivos
                .SelectedValuePath = "Id"
            End With
        End Sub

        ''' <summary>
        ''' Funcion que controla las reglas de negocio para habilitar el boton de carga
        ''' </summary>
        Private Sub HabilitarBotonCarga()
            Me.btnCargar.IsEnabled = (Not Me.txtArchivo.Text Is String.Empty And Not Me.cmbTitulares.SelectedValue Is Nothing)
        End Sub

        ''' <summary>
        ''' Funcion que obtiene el monto del movimiento y lo trasnforma a numero decimal
        ''' </summary>
        ''' <param name="monto">Monto con simbolo de moneda</param>
        ''' <returns>Monto en tipo decimal</returns>
        Private Function ObtenerMonto(ByVal monto As String) As Decimal
            Return Decimal.Parse(monto.Replace("$", String.Empty).Replace(" ", String.Empty).Replace("""", String.Empty))
        End Function

        Private Function ObtenerFecha(ByVal fecha As String) As Date
            Dim tmp() As String = fecha.Replace("de", "/").Split(CChar("/"))
            Dim respuesta As Date
            Dim dia As Integer = -1
            Dim mes As Integer = -1
            Dim año As Integer = -1

            If tmp.Length = 3 Then
                If Not String.IsNullOrEmpty(tmp(0)) Then
                    dia = Integer.Parse(tmp(0).Trim())
                End If

                If Not String.IsNullOrEmpty(tmp(1)) Then
                    Dim mes2 As String = tmp(1).Trim()

                    Select Case mes2.ToUpper()
                        Case "ENERO"
                            mes = 1
                        Case "FEBRERO"
                            mes = 2
                        Case "MARZO"
                            mes = 3
                        Case "ABRIL"
                            mes = 4
                        Case "MAYO"
                            mes = 5
                        Case "JUNIO"
                            mes = 6
                        Case "JULIO"
                            mes = 7
                        Case "AGOSTO"
                            mes = 8
                        Case "SEPTIEMBRE"
                            mes = 9
                        Case "OCTUBRE"
                            mes = 10
                        Case "NOVIEMBRE"
                            mes = 11
                        Case "DICIEMBRE"
                            mes = 12
                    End Select
                End If

                If Not String.IsNullOrEmpty(tmp(2)) Then
                    año = Integer.Parse(tmp(2).Trim())
                End If

            End If

            If dia <> -1 And mes <> -1 And año <> -1 Then
                respuesta = New Date(año, mes, dia)
            End If

            Return respuesta
        End Function

        ''' <summary>
        ''' Funcion que busca una cuenta con base en una descripcion dada
        ''' </summary>
        ''' <param name="cuenta">Descripcion de la cuenta a buscar</param>
        ''' <returns>La instancia de la cuenta encontrada, nulo en caso contrario</returns>
        Private Function ObtenerCuenta(ByVal cuenta As String) As Entidades.CuentaDTO
            Dim respuesta As DialogResult
            Dim nuevaCuenta As Entidades.CuentaDTO
            Dim tmp As Entidades.CuentaDTO = Nothing

            Try
                tmp = (From c In cuentasCarga _
                       Where c.Descripcion = cuenta _
                       Select c).First

                'En caso de no existir dicha cuenta preguntar al usario si desea crearla y ejecutar CargarDatos()
            Catch ex As InvalidOperationException
                respuesta = MessageBox.Show("¿Desea agregar la cuenta " + cuenta + " ?", "Confirmacion", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
                If respuesta = Forms.DialogResult.Yes Then
                    nuevaCuenta = New Entidades.CuentaDTO()
                    With nuevaCuenta
                        .Titular = _titularSeleccionado
                        .Descripcion = cuenta
                        .NumCuenta = cuenta
                        .IdBanco = 0
                        .FechaCreacion = Date.Now
                    End With

                    If Electrocucaracha.AdminPersonal.GUI.Cuenta.Manejador.Dao.Agregar(nuevaCuenta) Then
                        cuentasCarga = Electrocucaracha.AdminPersonal.GUI.Cuenta.Manejador.Cuentas
                        tmp = nuevaCuenta
                    End If
                End If
            End Try

            Return tmp
        End Function

        ''' <summary>
        ''' Funcion que busca una categoria con base en una descripcion dada
        ''' </summary>
        ''' <param name="categoria">Descripcion de la categoria a buscar</param>
        ''' <returns>La instancia de la categoria encontrada, nulo en caso contrario</returns>
        Private Function ObtenerCategoria(ByVal categoria As String) As Entidades.CategoriaDTO
            Dim respuesta As DialogResult
            Dim nuevaCategoria As Entidades.CategoriaDTO
            Dim tmp As Entidades.CategoriaDTO = Nothing

            Try
                tmp = (From c In categoriasCarga _
                       Where c.Descripcion = categoria _
                       Select c).First

                'En caso de no existir dicha categoria preguntar al usario si desea crearla y ejecutar CargarDatos()
            Catch ex As InvalidOperationException
                respuesta = MessageBox.Show("¿Desea agregar la categoria " + categoria + " ?", "Confirmacion", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
                If respuesta = Forms.DialogResult.Yes Then
                    nuevaCategoria = New Entidades.CategoriaDTO()
                    nuevaCategoria.Descripcion = categoria

                    'If Electrocucaracha.AdminPersonal.GUI.Categoria.Manejador.Dao.Agregar(nuevaCategoria) Then
                    '   categoriasCarga = Electrocucaracha.AdminPersonal.GUI.Categoria.Manejador.Categorias
                    '   tmp = nuevaCategoria
                    'End If
                End If
            End Try

            Return tmp
        End Function

        ''' <summary>
        ''' Funcion que lee el archivo y carga en la base de datos solo aquellos movimientos con diferente descripcion y monto
        ''' </summary>
        Private Sub CargarArchivo()
            Dim fr As StreamReader
            Dim sr As String
            Dim columnas() As String
            Dim tmpMovimiento As Entidades.MovimientoDTO
            Dim fi As FileInfo = New FileInfo(_nombreDeArchivo)
            Dim cursor As Input.Cursor

            'categoriasCarga = Categoria.Manejador.Categorias
            cuentasCarga = Cuenta.Manejador.Cuentas

            Try
                If fi.Exists Then
                    Me.lblProceso.Content = "Cargando..."
                    Me.pbProceso.Maximum = fi.Length
                    Me.pbProceso.Visibility = Windows.Visibility.Visible
                    cursor = Me.Cursor
                    Me.Cursor = Input.Cursors.Wait

                    fr = File.OpenText(_nombreDeArchivo)

                    While Not fr.EndOfStream
                        sr = fr.ReadLine()
                        Me.pbProceso.Value += sr.Length

                        tmpMovimiento = New Entidades.MovimientoDTO()

                        columnas = sr.Split(CChar(vbTab))

                        If columnas.Length > 3 Then

                            With tmpMovimiento
                                'Descripcion 
                                .Descripcion = columnas(0).Trim().Replace("""", String.Empty)

                                'Monto
                                .Monto = ObtenerMonto(columnas(1).Trim())

                                'Fecha
                                .Fecha = ObtenerFecha(columnas(2).Trim())

                                'Cuenta
                                If columnas.Length > 4 AndAlso Not String.IsNullOrEmpty(columnas(3)) Then
                                    .Cuenta = ObtenerCuenta(columnas(3).Trim())
                                Else
                                    .IdCuenta = 0
                                End If

                                'Categoria
                                If columnas.Length > 5 AndAlso Not String.IsNullOrEmpty(columnas(4)) Then
                                    .Categoria = ObtenerCategoria(columnas(4).Trim())
                                End If
                            End With
                            Movimiento.Manejador.Dao.Agregar(tmpMovimiento)
                            RaiseEvent MovimientoCambiado()
                        End If

                    End While

                    Me.lblProceso.Content = String.Empty
                    Me.pbProceso.Visibility = Windows.Visibility.Hidden
                    Me.Cursor = cursor

                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End Sub

        ''' <summary>
        ''' Funcion que carga el titular seleccionado en el combo
        ''' </summary>
        Private Sub SeleccionarTitular()
            If Not Titular.Manejador.Seleccion Is Nothing Then
                Me.cmbTitulares.SelectedValue = Titular.Manejador.Seleccion.Id
            End If
        End Sub

#End Region

        Private Sub btnAbrir_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnAbrir.Click
            Dim ofd As OpenFileDialog = New System.Windows.Forms.OpenFileDialog()
            With ofd
                .DefaultExt = "txt"
                .Filter = "Archivos de texto (*.txt)|*.txt"

                Dim result As DialogResult = .ShowDialog()

                If (result = Forms.DialogResult.OK) Then
                    Me._nombreDeArchivo = .FileName
                    Me.txtArchivo.Text = Me._nombreDeArchivo

                    HabilitarBotonCarga()
                End If
            End With
        End Sub

        Private Sub btnCerrar_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCerrar.Click
            Me.Close()
        End Sub

        Private Sub ImportarArchivoVentana_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles Me.Closing
            e.Cancel = True
            Me.Hide()
        End Sub

        Private Sub ImportarArchivoVentana_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            CargarTitulares()
            Me.pbProceso.Visibility = Windows.Visibility.Hidden
            HabilitarBotonCarga()

            AddHandler Titular.Manejador.TitularesActivosCambiados, AddressOf CargarTitulares
        End Sub

        Private Sub cmbTitulares_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles cmbTitulares.SelectionChanged
            HabilitarBotonCarga()
            If Not cmbTitulares.SelectedItem Is Nothing Then
                _titularSeleccionado = DirectCast(cmbTitulares.SelectedItem, Entidades.TitularDTO)
            End If
        End Sub

        Private Sub btnCargar_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnCargar.Click
            CargarArchivo()
        End Sub
    End Class

End Namespace